From 4c7a51f88ad8ca2d6a0f5e9aa82d7306e1f03c72 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 22 Sep 2017 10:02:27 -0400 Subject: [PATCH] vulkan: Move descriptor set layout to the render object We want to maintain a single descriptor set layout while introducing multiple pipeline layouts, so split this off. --- gsk/gskvulkanpipeline.c | 33 +++------------------------------ gsk/gskvulkanpipelineprivate.h | 6 ++---- gsk/gskvulkanrender.c | 28 ++++++++++++++++++++++++---- 3 files changed, 29 insertions(+), 38 deletions(-) diff --git a/gsk/gskvulkanpipeline.c b/gsk/gskvulkanpipeline.c index 71ea27e814..5863d20e35 100644 --- a/gsk/gskvulkanpipeline.c +++ b/gsk/gskvulkanpipeline.c @@ -15,7 +15,6 @@ struct _GskVulkanPipelineLayout GdkVulkanContext *vulkan; VkPipelineLayout pipeline_layout; - VkDescriptorSetLayout descriptor_set_layout; }; struct _GskVulkanPipelinePrivate @@ -190,7 +189,8 @@ gsk_vulkan_pipeline_get_pipeline (GskVulkanPipeline *self) /*** GskVulkanPipelineLayout ***/ GskVulkanPipelineLayout * -gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context) +gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context, + VkDescriptorSetLayout *descriptor_set_layout) { GskVulkanPipelineLayout *self; VkDevice device; @@ -201,27 +201,11 @@ gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context) device = gdk_vulkan_context_get_device (context); - GSK_VK_CHECK (vkCreateDescriptorSetLayout, device, - &(VkDescriptorSetLayoutCreateInfo) { - .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, - .bindingCount = 1, - .pBindings = (VkDescriptorSetLayoutBinding[1]) { - { - .binding = 0, - .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, - .descriptorCount = 1, - .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT - } - } - }, - NULL, - &self->descriptor_set_layout); - GSK_VK_CHECK (vkCreatePipelineLayout, device, &(VkPipelineLayoutCreateInfo) { .sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, .setLayoutCount = 1, - .pSetLayouts = &self->descriptor_set_layout, + .pSetLayouts = descriptor_set_layout, .pushConstantRangeCount = gst_vulkan_push_constants_get_range_count (), .pPushConstantRanges = gst_vulkan_push_constants_get_ranges () }, @@ -255,10 +239,6 @@ gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self) self->pipeline_layout, NULL); - vkDestroyDescriptorSetLayout (device, - self->descriptor_set_layout, - NULL); - g_slice_free (GskVulkanPipelineLayout, self); } @@ -268,10 +248,3 @@ gsk_vulkan_pipeline_layout_get_pipeline_layout (GskVulkanPipelineLayout *self) { return self->pipeline_layout; } - -VkDescriptorSetLayout -gsk_vulkan_pipeline_layout_get_descriptor_set_layout (GskVulkanPipelineLayout *self) -{ - return self->descriptor_set_layout; -} - diff --git a/gsk/gskvulkanpipelineprivate.h b/gsk/gskvulkanpipelineprivate.h index 504306a714..62550b2bc2 100644 --- a/gsk/gskvulkanpipelineprivate.h +++ b/gsk/gskvulkanpipelineprivate.h @@ -34,15 +34,13 @@ gsk_vulkan_handle_result (VkResult res, #define GSK_VK_CHECK(func, ...) gsk_vulkan_handle_result (func (__VA_ARGS__), G_STRINGIFY (func)) -GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context); +GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_new (GdkVulkanContext *context, + VkDescriptorSetLayout *descriptor_set_layout); GskVulkanPipelineLayout * gsk_vulkan_pipeline_layout_ref (GskVulkanPipelineLayout *self); void gsk_vulkan_pipeline_layout_unref (GskVulkanPipelineLayout *self); VkPipelineLayout gsk_vulkan_pipeline_layout_get_pipeline_layout (GskVulkanPipelineLayout *self); -VkDescriptorSetLayout gsk_vulkan_pipeline_layout_get_descriptor_set_layout - (GskVulkanPipelineLayout *self); - GskVulkanPipeline * gsk_vulkan_pipeline_new (GType pipeline_type, GskVulkanPipelineLayout *layout, diff --git a/gsk/gskvulkanrender.c b/gsk/gskvulkanrender.c index 0c96310b02..500eff6db1 100644 --- a/gsk/gskvulkanrender.c +++ b/gsk/gskvulkanrender.c @@ -40,6 +40,7 @@ struct _GskVulkanRender GskVulkanCommandPool *command_pool; VkFence fence; VkRenderPass render_pass; + VkDescriptorSetLayout descriptor_set_layout; GskVulkanPipelineLayout *layout; GskVulkanUploader *uploader; GskVulkanBuffer *vertex_buffer; @@ -176,7 +177,24 @@ gsk_vulkan_render_new (GskRenderer *renderer, NULL, &self->render_pass); - self->layout = gsk_vulkan_pipeline_layout_new (self->vulkan); + GSK_VK_CHECK (vkCreateDescriptorSetLayout, device, + &(VkDescriptorSetLayoutCreateInfo) { + .sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, + .bindingCount = 1, + .pBindings = (VkDescriptorSetLayoutBinding[1]) { + { + .binding = 0, + .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, + .descriptorCount = 1, + .stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT + } + } + }, + NULL, + &self->descriptor_set_layout); + + + self->layout = gsk_vulkan_pipeline_layout_new (self->vulkan, &self->descriptor_set_layout); self->uploader = gsk_vulkan_uploader_new (self->vulkan, self->command_pool); @@ -447,9 +465,7 @@ gsk_vulkan_render_prepare_descriptor_sets (GskVulkanRender *self, VkDescriptorSetLayout *layouts = g_newa (VkDescriptorSetLayout, needed_sets); for (i = 0; i < needed_sets; i++) - { - layouts[i] = gsk_vulkan_pipeline_layout_get_descriptor_set_layout (self->layout); - } + layouts[i] = self->descriptor_set_layout; GSK_VK_CHECK (vkAllocateDescriptorSets, device, &(VkDescriptorSetAllocateInfo) { @@ -650,6 +666,10 @@ gsk_vulkan_render_free (GskVulkanRender *self) g_free (self->descriptor_sets); g_hash_table_unref (self->descriptor_set_indexes); + vkDestroyDescriptorSetLayout (device, + self->descriptor_set_layout, + NULL); + vkDestroyFence (device, self->fence, NULL); -- 2.30.2